import {
  Controller,
  Post,
  Body,
  Get,
  Param,
  Put,
  Delete,
  UseGuards,
  Request,
} from '@nestjs/common';
import { PostService } from './post.service';
import { CreatePostDTO } from 'src/dto/post/create-post.dto';
import { UpdatePostDTO } from 'src/dto/post/update-post.dto';
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiBearerAuth,
  ApiParam,
} from '@nestjs/swagger';
import { AuthGuard } from 'src/core/auth/auth.guard';

@ApiTags('文章管理')
@Controller('post')
export class PostController {
  constructor(private readonly postService: PostService) {}

  /**
   * 创建新文章
   * @param request 请求对象
   * @param createPostDTO 文章数据
   * @returns 创建的文章
   */
  @ApiOperation({ summary: '创建新文章', description: '创建一篇新的博客文章' })
  @ApiBearerAuth()
  @ApiResponse({ status: 201, description: '文章创建成功' })
  @ApiResponse({ status: 401, description: '未授权' })
  @ApiResponse({ status: 404, description: '用户不存在' })
  @UseGuards(AuthGuard)
  @Post()
  async createPost(@Request() req, @Body() createPostDTO: CreatePostDTO) {
    const userId = req.user.id;
    return this.postService.createPost(userId, createPostDTO);
  }

  /**
   * 获取文章列表
   * @returns 文章列表
   */
  @ApiOperation({
    summary: '获取文章列表',
    description: '获取所有博客文章列表',
  })
  @ApiResponse({ status: 200, description: '成功获取文章列表' })
  @Get()
  async getPosts() {
    return this.postService.getPosts();
  }

  /**
   * 获取单篇文章详情
   * @param id 文章ID
   * @returns 文章详情
   */
  @ApiOperation({
    summary: '获取文章详情',
    description: '根据ID获取单篇文章的详细信息',
  })
  @ApiParam({ name: 'id', description: '文章ID' })
  @ApiResponse({ status: 200, description: '成功获取文章详情' })
  @ApiResponse({ status: 404, description: '文章不存在' })
  @Get(':id')
  async getPostById(@Param('id') id: number) {
    return this.postService.getPostById(id);
  }

  /**
   * 获取用户文章列表
   * @param userId 用户ID
   * @returns 用户文章列表
   */
  @ApiOperation({
    summary: '获取用户文章列表',
    description: '根据用户ID获取用户发布的所有文章列表',
  })
  @ApiParam({ name: 'userId', description: '用户ID' })
  @ApiResponse({ status: 200, description: '成功获取用户文章列表' })
  @ApiResponse({ status: 404, description: '用户不存在' })
  @Get('user/:userId')
  async getPostsByUser(@Param('userId') userId: number) {
    return this.postService.getPostsByUser(userId);
  }

  /**
   * 更新文章
   * @param request 请求对象
   * @param id 文章ID
   * @param updatePostDTO 更新数据
   * @returns 更新后的文章
   */
  @ApiOperation({ summary: '更新文章', description: '更新指定ID的博客文章' })
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: '文章ID' })
  @ApiResponse({ status: 200, description: '文章更新成功' })
  @ApiResponse({ status: 401, description: '未授权' })
  @ApiResponse({ status: 404, description: '文章不存在或无权限修改' })
  @UseGuards(AuthGuard)
  @Put(':id')
  async updatePost(
    @Request() req,
    @Param('id') id: number,
    @Body() updatePostDTO: UpdatePostDTO,
  ) {
    const userId = req.user.id;
    return this.postService.updatePost(id, userId, updatePostDTO);
  }

  /**
   * 删除文章
   * @param request 请求对象
   * @param id 文章ID
   */
  @ApiOperation({ summary: '删除文章', description: '删除指定ID的博客文章' })
  @ApiBearerAuth()
  @ApiParam({ name: 'id', description: '文章ID' })
  @ApiResponse({ status: 200, description: '文章删除成功' })
  @ApiResponse({ status: 401, description: '未授权' })
  @ApiResponse({ status: 404, description: '文章不存在或无权限删除' })
  @UseGuards(AuthGuard)
  @Delete(':id')
  async deletePost(@Request() req, @Param('id') id: number) {
    const userId = req.user.id;
    return this.postService.deletePost(id, userId);
  }
}
